package com.feicheng.common.wx.pay;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.SignatureException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.UUID;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.DefaultHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.feicheng.common.constant.Constant;
import com.feicheng.common.exception.SystemException;
import com.feicheng.common.wx.WxHTTPInterface;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data
@Slf4j
public class WxPayBean {

//    private WxHTTPInterface wxHTTPInterface;

//    private String appId;
//    private String secKey;
//    private String mchid;
//    private String merchantSerialNo;
//    private String merchantPrivateKeyStr;
//    private String apiV3Key;
//    private String certV2;
//    private String privateKeyV2;
//    private String apiV2Key;
//    private String payUrl;
//    private WxPayHttpClientFactory factory;
//    private WechatPayUtils wechatPayUtils;
//    private AesUtil aesUtil;

//    private V2 v2;
    
//    private static Random random = new Random();
    
    public WxPayBean() {}

//    public WxPayBean(String appId,
//                     String secKey,
//                     String mchid,
//                     String merchantSerialNo,
//                     String merchantPrivateKeyStr,
//                     String apiV3Key,
//                     String certV2,
//                     String privateKeyV2,
//                     String apiV2Key,
//                     String payUrl,
//                     WxHTTPInterface wxHTTPInterface) {
//        this.appId = appId;
//        this.mchid = mchid;
//        this.secKey = secKey;
//        this.merchantSerialNo = merchantSerialNo;
//        this.merchantPrivateKeyStr = merchantPrivateKeyStr;
//        this.apiV3Key = apiV3Key;
//        this.certV2 = certV2;
//        this.privateKeyV2 = privateKeyV2;
//        this.apiV2Key = apiV2Key;
//        this.payUrl = payUrl;
//        this.aesUtil = new AesUtil(apiV3Key.getBytes());
//        this.wxHTTPInterface = wxHTTPInterface;
//        factory = new WxPayHttpClientFactory.Builder(mchid)
//                .setMerchantSerialNo(merchantSerialNo)
//                .setMerchantPrivateKeyStr(merchantPrivateKeyStr)
//                .setApiV3Key(apiV3Key)
//                .build();
//        wechatPayUtils = new WechatPayUtils();
//        v2 = new V2();
//    }

//    public V2 getV2() {
//        return this.v2;
//    }
//
//    public String createOutTradeNoForDepositIn(Integer storeId, Integer clientId, Integer payId) {
//        return createOutTradeNo("DI-", storeId, clientId, payId);
//    }
//
//    public String createOutTradeNoForDepositOut(Integer storeId, Integer clientId, Integer payId) {
//        return createOutTradeNo(
//                "DO-", storeId, clientId, payId);
//    }
//
//    public String createOutTradeNoForOrder(Integer orderId, Integer storeId, Integer clientId, Integer payId) {
//        return createOutTradeNo(
//                new StringBuilder("OI_").append(orderId).append("-").toString(), storeId, clientId, payId);
//    }
//
//    public String createOutTradeNoForCardIn(Integer storeId, Integer clientId, Integer payId) {
//        return createOutTradeNo(
//                new StringBuilder("CI").append("-").toString(), storeId, clientId, payId);
//    }
//
//    public JSONObject releaseOutTradeNo(String outTradeNo) {
//        JSONObject result = new JSONObject();
//
//        String[] otNArray = outTradeNo.split("-");
//
//        String otNHead = otNArray[0];
//        String otNData = otNArray[1];
//        String[] bIdArray = otNHead.split("_");
//        if (outTradeNo.startsWith("OI")) {
//            result.put(Constant.ENTITY.ORDER.ORDER_ID, Integer.valueOf(bIdArray[1]));
//        }
//
//        String[] idArray = otNData.split("_");
//        result.put(Constant.ENTITY.STORE.STORE_ID, Integer.valueOf(idArray[0]));
//        result.put(Constant.ENTITY.CLIENT.CLIENT_ID, Integer.valueOf(idArray[1]));
//        result.put(Constant.ENTITY.PAYMENT_RECORD.PAY_ID, Integer.valueOf(idArray[2]));
//        return result;
//    }
//
//    public static String getRandomString(int length) {
//        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
//        StringBuffer sb = new StringBuffer();
//
//        for(int i = 0; i < length; ++i) {
//            int number = random.nextInt(62);
//            sb.append(str.charAt(number));
//        }
//
//        return sb.toString();
//    }
//
//    private String createOutTradeNo(String otNHeader, Integer storeId, Integer clientId, Integer payId) {
//        StringBuilder sbResult = new StringBuilder(otNHeader);
//        sbResult.append(storeId).append("_").append(clientId).append("_").append(payId).append("_");
//        String resultTemp = sbResult.toString();
//        if (resultTemp.length() < 32) {
//            int tempLength = 32 - resultTemp.length();
//            sbResult.append(getRandomString(tempLength));
//        }
//
//        return sbResult.toString();
//    }
//
//    /**
//     * 解密回调报文
//     * @param associatedData 附加数据
//     * @param nonce 加密使用的随机串
//     * @param ciphertext Base64编码后的开启/停用结果数据密文
//     * @return 解密后的报文
//     */
//    public String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext) {
//        try {
//            return this.aesUtil.decryptToString(associatedData, nonce, ciphertext);
//        } catch (Exception e) {
//            throw new SystemException("解密报文失败", e);
//        }
//    }
//
//    /**
//     * 参考网站 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml
//     * 计算签名值
//     *
//     * @param prepay_id
//     * @return
//     * @throws IOException
//     * @throws SignatureException
//     * @throws NoSuchAlgorithmException
//     * @throws InvalidKeyException
//     */
//    public HashMap<String, Object> getTokenJSAPI(String prepay_id) {
//        HashMap<String, Object> map = new HashMap<String, Object>();
//
//        try {
//
//            // 获取随机字符串
//            String nonceStr = wechatPayUtils.getNonceStr();
//            // 获取支付package
//            String packagestr = "prepay_id=" + prepay_id;
//            long timestamp = System.currentTimeMillis() / 1000;
//            //签名，使用字段appId、timeStamp、nonceStr、package计算得出的签名值
//            String message = wechatPayUtils.buildMessageTwo(appId, timestamp, nonceStr, packagestr);
//            //获取对应的签名
//            String signature = wechatPayUtils.sign(message.getBytes("utf-8"));
//            // 组装返回
//
//            map.put("appId", appId);
//            map.put("timeStamp", String.valueOf(timestamp));
//            map.put("nonceStr", nonceStr);
//            map.put("package", packagestr);
//            map.put("signType", "RSA");
//            map.put("paySign", signature);
//
//        } catch (NoSuchAlgorithmException | SignatureException | IOException | InvalidKeyException e) {
//            throw new SystemException("唤起支付准备出现问题", e);
//        }
//
//        return map;
//    }
//
//
//    /**
//     * 参考网站 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml
//     * 计算签名值
//     *
//     * @param prepay_id
//     * @return
//     * @throws IOException
//     * @throws SignatureException
//     * @throws NoSuchAlgorithmException
//     * @throws InvalidKeyException
//     */
//    public HashMap<String, Object> getTokenApp(String prepay_id) throws IOException, SignatureException, NoSuchAlgorithmException, InvalidKeyException {
//        // 获取随机字符串
//        String nonceStr = wechatPayUtils.getNonceStr();
//        // 获取支付package
//        long timestamp = System.currentTimeMillis() / 1000;
//        //签名，使用字段appId、timeStamp、nonceStr、package计算得出的签名值
//        String message = wechatPayUtils.buildMessageTwo(appId, timestamp, nonceStr, prepay_id);
//        //获取对应的签名
//        String signature = wechatPayUtils.sign(message.getBytes("utf-8"));
//        // 组装返回
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("appId", appId);
//        map.put("partnerid", mchid);
//        map.put("prepayid", prepay_id);
//        map.put("package", "Sign=WXPay");
//        map.put("nonceStr", nonceStr);
//        map.put("timeStamp", String.valueOf(timestamp));
//        map.put("sign", signature);
//        return map;
//    }
//
//    /**
//     * app关闭订单接口地址 POST方式
//     *
//     * @param outTradeNo 商户订单号
//     * @return app关闭订单接口地址
//     */
//    private URI getWxAppCloseOrderUrl(String outTradeNo) {
//        return getUri("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + outTradeNo + "/close");
//    }
//
//    /**
//     * 将地址变成URI形式
//     *
//     * @param path 请求地址
//     * @return uri
//     */
//    private static URI getUri(String path) {
//        URI uri = null;
//        try {
//            URL url = new URL(path);
//            uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), null);
//        } catch (MalformedURLException | URISyntaxException e) {
//            e.printStackTrace();
//            throw new SystemException("转换地址失败");
//        }
//        return uri;
//    }
//
//    /**
//     * 设置请求头 设置Content-Type 和 Accept 为 application/json 格式
//     *
//     * @param httpRequest 请求
//     */
//    private static void setHeaders(HttpRequestBase httpRequest) {
//        httpRequest.setHeader("Content-Type", "application/json;utf-8");
//        httpRequest.setHeader("Accept", "application/json");
//    }
//
//    /**
//     * 检查返回对象
//     *
//     * @param response
//     * @return
//     */
//    private boolean isOk(CloseableHttpResponse response) {
//        return HttpStatus.SC_OK == response.getStatusLine().getStatusCode();
//    }
//
//    /**
//     * @param outTradeNo  本地订单编号 （payment_record -> pay_id
//     * @param description 描述
//     * @param notifyUrl   回调地址
//     * @param amount      金额
//     * @param openId      客户的openId
//     * @return prepayId 预支付交易单ID
//     */
//    public String jsapi(String outTradeNo, String description, String notifyUrl, Integer amount, String openId) {
//
//        CloseableHttpClient httpClient = factory.getHttpClient();
//        try {
//            HttpPost httpPost = new HttpPost(wxHTTPInterface.getJsapi());
////            setHeaders(httpPost);
//
//            httpPost.addHeader("Accept", "application/json");
//            httpPost.addHeader("Content-type","application/json; charset=utf-8");
//
//            ByteArrayOutputStream bos = new ByteArrayOutputStream();
//            ObjectMapper objectMapper = new ObjectMapper();
//
//            ObjectNode rootNode = objectMapper.createObjectNode();
//            rootNode.put("mchid", this.mchid)
//                    .put("appid", this.appId)
//                    .put("description", description)
//                    .put("notify_url", payUrl + notifyUrl)
//                    .put("out_trade_no", outTradeNo);
//            rootNode.putObject("amount")
//                    .put("total", amount);
//            rootNode.putObject("payer")
//                    .put("openid", openId);
//
//
//            objectMapper.writeValue(bos, rootNode);
//
//            StringEntity se = new StringEntity(bos.toString("UTF-8"), "UTF-8");
//
//            httpPost.setEntity(se);
//
//            CloseableHttpResponse response = httpClient.execute(httpPost);
//
//            try {
//                String bodyAsString = EntityUtils.toString(response.getEntity());
//                if (isOk(response)) {
//                    String prepayId = JSONObject.parseObject(bodyAsString).getString("prepay_id");
//                    log.info("统一预付单下单成功 ：" + prepayId);
//                    return prepayId;
//                } else {
//                    log.error(bodyAsString);
//                    throw new SystemException(bodyAsString);
//                }
//            } finally {
//                response.close();
//            }
//        } catch (Exception e) {
//            log.error("支付失败：统一预付单失败", e);
//            throw new SystemException("支付失败：统一预付单失败");
//        } finally {
//            try {
//                httpClient.close();
//            } catch (IOException e) {
//                log.error("关闭HTTP客户端失败", e);
//            }
//        }
//    }
//
//    /**
//     * 关闭订单
//     *
//     * @param payId 订单id
//     * @return 成功[true]，失败[false]
//     */
//    public boolean appCloseOrder(String payId) {
//        CloseableHttpClient httpClient = factory.getHttpClient();
//        HttpPost post = new HttpPost(getWxAppCloseOrderUrl(payId));
//        boolean result = false;
//        //封装传递参数
//        JSONObject requestJson = new JSONObject();
//        requestJson.put("mchid", this.mchid);       //商户号
//        StringEntity entity = new StringEntity(requestJson.toString(), "UTF-8");
//        //设置请求参数和请求头
//        entity.setContentType("application/json");
//        entity.setContentEncoding("UTF-8");
//        setHeaders(post);
//        post.setEntity(entity);
//        try {
//            CloseableHttpResponse response = httpClient.execute(post);
//
//            try {
//                result = isOk(response);
//                EntityUtils.consume(response.getEntity());
//            } finally {
//                response.close();
//            }
//
//        } catch (IOException e) {
//            log.error("微信支付-关闭下单-失败！", e);
//            throw new SystemException("微信支付-关闭下单-失败！");
//        } finally {
//            try {
//                httpClient.close();
//            } catch (IOException e) {
//                log.error("关闭HTTP客户端失败", e);
//            }
//        }
//        return result;
//    }
//
//
//    private class WechatPayUtils {
//
//        /**
//         * 获取私钥
//         *
//         * @param filename 私钥文件路径  (required)
//         * @return 私钥对象
//         */
//        public PrivateKey getPrivateKeyByFile(String filename) throws IOException {
//            System.out.println("filename:" + filename);
//            String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
//            try {
//                String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
//                        .replace("-----END PRIVATE KEY-----", "")
//                        .replaceAll("\\s+", "");
//
//                KeyFactory kf = KeyFactory.getInstance("RSA");
//                return kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));
//            } catch (NoSuchAlgorithmException e) {
//                throw new RuntimeException("当前Java环境不支持RSA", e);
//            } catch (InvalidKeySpecException e) {
//                throw new RuntimeException("无效的密钥格式");
//            }
//        }
//
//        /**
//         * 获取私钥
//         *
//         * @param key 私钥内容  (required)
//         * @return 私钥对象
//         */
//        public PrivateKey getPrivateKey(String key) throws IOException {
//            try {
//                String privateKey = key.replace("-----BEGIN PRIVATE KEY-----", "")
//                        .replace("-----END PRIVATE KEY-----", "")
//                        .replaceAll("\\s+", "");
//
//                KeyFactory kf = KeyFactory.getInstance("RSA");
//                return kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));
//            } catch (NoSuchAlgorithmException e) {
//                throw new SystemException("当前Java环境不支持RSA", e);
//            } catch (InvalidKeySpecException e) {
//                throw new SystemException("无效的密钥格式");
//            }
//        }
//
//        /**
//         * 生成token 也就是生成签名
//         *
//         * @param method
//         * @param url
//         * @param body
//         * @return
//         * @throws Exception
//         */
//        public String getToken(String method, URL url, String body) throws Exception {
//            String nonceStr = getNonceStr();
//            long timestamp = System.currentTimeMillis() / 1000;
//            String message = buildMessage(method, url, timestamp, nonceStr, body);
//            String signature = sign(message.getBytes("utf-8"));
//
//            return "WECHATPAY2-SHA256-RSA2048 " + "mchid=\"" + mchid + "\","
//                    + "nonce_str=\"" + nonceStr + "\","
//                    + "timestamp=\"" + timestamp + "\","
//                    + "serial_no=\"" + merchantSerialNo + "\","
//                    + "signature=\"" + signature + "\"";
//        }
//
//
//        /**
//         * 获取平台证书
//         *
//         * @return
//         */
//        public Map<String, X509Certificate> refreshCertificate() throws Exception {
//            Map<String, X509Certificate> certificateMap = new HashMap();
//            // 1: 执行get请求
//            CloseableHttpClient httpClient = factory.getHttpClient();
//            String url = "https://api.mch.weixin.qq.com/v3/certificates";
//            HttpGet get = new HttpGet(url);
//
//
//            String token = getToken("GET", new URL(url), "");
//            get.addHeader("Authorization", token);
//            CloseableHttpResponse httpResponse = httpClient.execute(get);
//            if (httpResponse.getStatusLine().getStatusCode() == 200) {
//
//                String jsonResult = EntityUtils.toString(httpResponse.getEntity());
//                ObjectMapper JSON = new ObjectMapper();
//                JsonNode jsonNode = JSON.readTree(jsonResult);
//
//                // 2: 获取平台验证的相关参数信息
//                JsonNode data = jsonNode.get("data");
//                if (data != null) {
//                    for (int i = 0; i < data.size(); i++) {
//                        JsonNode encrypt_certificate = data.get(i).get("encrypt_certificate");
//                        //对关键信息进行解密
//
//                        String associated_data = encrypt_certificate.get("associated_data").toString().replaceAll("\"", "");
//                        String nonce = encrypt_certificate.get("nonce").toString().replaceAll("\"", "");
//                        String ciphertext = encrypt_certificate.get("ciphertext").toString().replaceAll("\"", "");
//                        //证书内容
//                        String certStr = aesUtil.decryptToString(associated_data.getBytes(), nonce.getBytes(), ciphertext);
//                        //证书内容转成证书对象
//                        CertificateFactory cf = CertificateFactory.getInstance("X509");
//                        X509Certificate x509Cert = (X509Certificate) cf.generateCertificate(
//                                new ByteArrayInputStream(certStr.getBytes("utf-8"))
//                        );
//                        String serial_no = data.get(i).get("serial_no").toString().replaceAll("\"", "");
//                        certificateMap.put(serial_no, x509Cert);
//                    }
//                }
//            } else {
//                throw new SystemException("取得商户平台证书失败");
//            }
//
//
//            return certificateMap;
//        }
//
//        /**
//         * 生成签名串
//         *
//         * @param method
//         * @param url
//         * @param timestamp
//         * @param nonceStr
//         * @param body
//         * @return
//         */
//        public String buildMessage(String method, URL url, long timestamp, String nonceStr, String body) {
//            String canonicalUrl = url.getPath();
//            if (url.getQuery() != null) {
//                canonicalUrl += "?" + url.getQuery();
//            }
//            return method + "\n"
//                    + canonicalUrl + "\n"
//                    + timestamp + "\n"
//                    + nonceStr + "\n"
//                    + body + "\n";
//        }
//
//        /**
//         * 生成随机数
//         *
//         * @return
//         */
//        public String getNonceStr() {
//            return UUID.randomUUID().toString()
//                    .replaceAll("-", "")
//                    .substring(0, 32);
//        }
//
//        /**
//         * 验证签名
//         *
//         * @param certificate
//         * @param message
//         * @param signature
//         * @return
//         */
//        public boolean verify(X509Certificate certificate, byte[] message, String signature) {
//            try {
//                Signature sign = Signature.getInstance("SHA256withRSA");
//                sign.initVerify(certificate);
//                sign.update(message);
//                return sign.verify(Base64.getDecoder().decode(signature));
//            } catch (NoSuchAlgorithmException e) {
//                throw new RuntimeException("当前Java环境不支持SHA256withRSA", e);
//            } catch (SignatureException e) {
//                throw new RuntimeException("签名验证过程发生了错误", e);
//            } catch (InvalidKeyException e) {
//                throw new RuntimeException("无效的证书", e);
//            }
//        }
//
//        /**
//         * 拼接参数
//         *
//         * @return
//         */
//
//        private String buildMessageTwo(String appId, long timestamp, String nonceStr, String packag) {
//            return appId + "\n"
//                    + timestamp + "\n"
//                    + nonceStr + "\n"
//                    + packag + "\n";
//        }
//
//
//        /**
//         * 生成签名
//         *
//         * @return
//         */
//
//        private String sign(byte[] message) throws NoSuchAlgorithmException, SignatureException, IOException, InvalidKeyException {
//            Signature sign = Signature.getInstance("SHA256withRSA"); //SHA256withRSA
//            sign.initSign(getPrivateKey(merchantPrivateKeyStr));
//            sign.update(message);
//            return Base64.getEncoder().encodeToString(sign.sign());
//        }
//
//
//    }
//
//    public class V2 {
//
//        /**
//         * 初始化客户端
//         *
//         * @return httpClient
//         */
//        public HttpClient initHttpClient() throws Exception {
//
//            // 证书
//            char[] password = mchid.toCharArray();
//            InputStream certStream = new FileInputStream(certV2);
//            KeyStore ks = KeyStore.getInstance("PKCS12");
//            ks.load(certStream, password);
//
//            // 实例化密钥库 & 初始化密钥工厂
//            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
//            kmf.init(ks, password);
//
//            // 创建 SSLContext
//            SSLContext sslContext = SSLContext.getInstance("TLS");
//            sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
//
//            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
//                    sslContext,
//                    new String[]{"TLSv1"},
//                    null,
//                    new DefaultHostnameVerifier());
//
//            BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager(
//                    RegistryBuilder.<ConnectionSocketFactory>create()
//                            .register("http", PlainConnectionSocketFactory.getSocketFactory())
//                            .register("https", sslConnectionSocketFactory)
//                            .build(),
//                    null,
//                    null,
//                    null
//            );
//
//
//            HttpClient httpClient = HttpClientBuilder.create()
//                    .setConnectionManager(connManager)
//                    .build();
//
//            return httpClient;
//
//        }
//
//        public Map<String, String> payClient(String tradeNo, Integer amount, String openId) {
//            try {
//
//                HttpClient httpClient = initHttpClient();
//                HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers");
//
//                httpPost.setHeader("Content-Type", "text/xml");
//                httpPost.setHeader("User-Agent", WXPayConstants.USER_AGENT+" "+mchid);
//
//                Map<String, String> data = new HashMap<>();
//                data.put("amount", amount.toString());
//                data.put("check_name", "NO_CHECK");
//                data.put("desc", "tuikuan");
//                data.put("mchid", mchid);
//                data.put("mch_appid", appId);
//                data.put("nonce_str", WXPayUtilV2.generateNonceStr());
//                data.put("openid", openId);
//                data.put("partner_trade_no", tradeNo);
//                data.put("sign", WXPayUtilV2.generateSignature(data, apiV2Key, WXPayConstants.SignType.MD5));
//
//                String xml = WXPayUtilV2.mapToXml(data);
//                StringEntity se = new StringEntity(xml, "UTF-8");
//                httpPost.setEntity(se);
//                HttpResponse response = httpClient.execute(httpPost);
//
//                String bodyAsString = EntityUtils.toString(response.getEntity());
//                log.info("付款 ：" + bodyAsString);
//                return WXPayUtilV2.xmlToMap(bodyAsString);
//            } catch (Exception e) {
//                log.error("付款：付款失败", e);
//                throw new SystemException("付款：付款失败");
//            }
//        }
//
//    }

}
